#include "ManejadorCargo.h"

using namespace Manejadores;

ManejadorCargo::ManejadorCargo() {

	Configuracion* config = Configuracion::getInstancia();
	string pathDeDatos = config->getNombreArchivoCargo();
	this->cargos = new ArchivoDeEstructurasVariables(pathDeDatos);
	this->indicePorUnicidad = new HashExtensible("IndicePorUnicidadCargo");
}

bool ManejadorCargo::alta(Cargo* cargo) {

	if (!indicePorUnicidad->existe(cargo->getNombre())) {
		unsigned int posicionDelRegistro = cargos->insertar(cargo);
		indicePorUnicidad->insertar(cargo->getNombre(), posicionDelRegistro);

		this->indicePorUnicidad->exportarTxt("IndicePorUnicidadCargo");
		return true;
	} else
		return false;
}

bool ManejadorCargo::baja(Cargo* cargo) {

	IRegistroIndice* aBorrar = indicePorUnicidad->buscar(cargo->getNombre());
	if (aBorrar->getOffsets()->size() > 0) {
		cargos->borrar(cargo, aBorrar->getOffsets()->at(0));
		indicePorUnicidad->eliminar(cargo->getNombre(),	aBorrar->getOffsets()->at(0));
		delete aBorrar;

		this->indicePorUnicidad->exportarTxt("IndicePorUnicidadCargo");
		return true;
	} else{
		delete aBorrar;
		return false;
	}
}

bool ManejadorCargo::modificacion(Cargo* cargo, string viejoNombre) {

	if(indicePorUnicidad->existe(viejoNombre)){
		IRegistroIndice* viejaPosicion = indicePorUnicidad->buscar(viejoNombre);
		unsigned int nuevaPosicion = cargos->modificar(cargo, viejaPosicion->getOffsets()->at(0));

		if (viejaPosicion->getOffsets()->at(0) != nuevaPosicion){
			indicePorUnicidad->modificar(cargo->getNombre(),viejaPosicion->getOffsets()->at(0),nuevaPosicion);
		}
		return true;
	}else
		return false;
}

bool ManejadorCargo::existe(string nombreCargo){

	return this->indicePorUnicidad->existe(nombreCargo);
}

Cargo* ManejadorCargo::recuperar(string nombreCargo){
	IRegistroIndice* registro = indicePorUnicidad->buscar(nombreCargo);
	if (registro->getOffsets()->size() > 0){
		Cargo* cargo = new Cargo();
		this->cargos->leer(cargo,registro->getOffsets()->at(0));
		delete registro;
		return cargo;
	}else{
		delete registro;
		return NULL;
	}
}

ManejadorCargo::~ManejadorCargo() {
	delete this->cargos;
	delete this->indicePorUnicidad;
}
